package com.javarush.test.level18.lesson10.home08;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/* Нити и байты
Читайте с консоли имена файлов, пока не будет введено слово "exit"
Передайте имя файла в нить ReadThread
Нить ReadThread должна найти байт, который встречается в файле максимальное число раз, и добавить его в словарь resultMap,
где параметр String - это имя файла, параметр Integer - это искомый байт.
Не забудьте закрыть все потоки
*/

public class Solution {
    public volatile static Map<String, Integer> resultMap = new HashMap<String, Integer>();

    public static void main(String[] args) throws IOException {
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        String file=null;
        while(!(file=reader.readLine()).equals("exit"))
        {
            new ReadThread(file).start();
        }
        for (Map.Entry<String,Integer> map :resultMap.entrySet())
        {
            System.out.println(map.getKey() + " " + map.getValue());
        }
        reader.close();

    }


    public static class ReadThread extends Thread {
        volatile String filename;
        public ReadThread(String fileName) {
            this.filename=fileName;
        }
        public void run()
        {
            Map<Byte, Integer> thisMap = new HashMap<Byte, Integer>();
            int max = 0;
            byte res = 0;

            try {
                FileInputStream fileName= new FileInputStream(filename);


                try {
                    byte[] a= new byte[fileName.available()];
                    fileName.read(a);
                    for (int i=0; i<a.length; i++) {
                        if (thisMap.containsKey(a[i])) {
                            int count = thisMap.get(a[i])+ 1;
                            thisMap.put(a[i], count);
                        }
                        else
                        {
                            thisMap.put(a[i], 1);
                        }
                    }

                    for (Map.Entry<Byte, Integer> entry :thisMap .entrySet())
                    {
                        if (entry.getValue() > max) {
                            max = entry.getValue();
                            res = entry.getKey();
                        }
                    }
                    int x=((int) res) & 0xFF;

                    if (!(max==0))resultMap.put(filename,x);
                    try {
                        fileName.close();
                    }
                    catch (IOException e) {
                        System.out.print("IOException");
                    }
                }
                catch (IOException e) {
                    System.out.print("IOException");
                }

            } catch (FileNotFoundException e) {
                System.out.print("FileNotFoundException");
            }
        }
    }
}
